﻿// 2007, Patrick Hunlock, public domain code for dynamic CSS rule manipulation
// 2010, modified to better use standard DOM method insertRule(), Nikolai Amelichev
// http://www.hunlock.com/blogs/Totally_Pwn_CSS_with_Javascript

function getCSSRule(ruleName, deleteFlag) { // Return requested style obejct
    ruleName = ruleName.toLowerCase(); // Convert test string to lower case.
    if (document.styleSheets) { // If browser can play with stylesheets
        for (var i = 0; i < document.styleSheets.length; i++) { // For each stylesheet
            var styleSheet = document.styleSheets[i]; // Get the current Stylesheet
            var ii = 0; // Initialize subCounter.
            var cssRule = false; // Initialize cssRule. 
            do { // For each rule in stylesheet
                if (styleSheet.cssRules) { // Browser uses cssRules?
                    cssRule = styleSheet.cssRules[ii]; // Yes --Mozilla Style
                } else { // Browser usses rules?
                    cssRule = styleSheet.rules[ii]; // Yes IE style. 
                } // End IE check.
                if (cssRule) { // If we found a rule...
                    if (cssRule.selectorText && cssRule.selectorText.toLowerCase() == ruleName) { // match ruleName?
                        if (deleteFlag == 'delete') { // Yes. Are we deleteing?
                            if (styleSheet.cssRules) { // Yes, deleting...
                                styleSheet.deleteRule(ii); // Delete rule, Moz Style
                            } else { // Still deleting.
                                styleSheet.removeRule(ii); // Delete rule IE style.
                            } // End IE check.
                            return true; // return true, class deleted.
                        } else { // found and not deleting.
                            return cssRule; // return the style object.
                        } // End delete Check
                    } // End found rule name
                } // end found cssRule
                ii++; // Increment sub-counter
            } while (cssRule) // end While loop
        } // end For loop
    } // end styleSheet ability check
    return false; // we found NOTHING!
} // end getCSSRule 

function killCSSRule(ruleName) { // Delete a CSS rule 
    return getCSSRule(ruleName, 'delete'); // just call getCSSRule w/delete flag.
} // end killCSSRule

function addCSSRule(ruleName) { // Create a new css rule
    if (document.styleSheets) { // Can browser do styleSheets?
        if (!getCSSRule(ruleName)) { // if rule doesn't exist...
            if (!document.styleSheets[0].insertRule) { // Browser is IE?
                document.styleSheets[0].addRule(ruleName, null, 0); // Yes, add IE style
                return getCSSRule(ruleName); // return rule we just created.
            } else { // Browser is IE?
                var idx = document.styleSheets[0].insertRule(ruleName + ' { }', 0);
                return document.styleSheets[0].cssRules[idx]; // Yes, add Moz style.
            } // End browser check
        } else { // End already exist check.
            return getCSSRule(ruleName);
        }
    } // End browser ability check.
} 
